package com.example.micro.netty.server.thread.pool;

import lombok.AllArgsConstructor;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/**
 * @author Code Farmer
 * @create 2020/10/21 10:07 下午
 */
@AllArgsConstructor
public class CountTask extends RecursiveTask<Long> {

    private static int THRESHOLD = 10000;
    private long start;
    private long end;


    @Override
    protected Long compute() {
        long sum = 0;
        boolean camCompute = (end - start) < THRESHOLD;

        if (camCompute) {
            for (long i = start; i < end; i++) {
                sum += i;
            }
        } else {
            //分成100小块
            long step = (start + end) / 100;
            List<CountTask> subTasks = new ArrayList<>();
            long pos = start;
            for (int i = 0; i < 100; i++) {
                long lastOne = pos + step;
                if (lastOne > end) {
                    lastOne = end;
                }
                CountTask subTask = new CountTask(pos, lastOne);
                pos += step + 1;
                subTasks.add(subTask);
                subTask.fork();
            }

            for (CountTask t : subTasks) {
                sum += t.join();
            }
        }

        return sum;
    }


    public static void main(String[] args) {
        ForkJoinPool forkJoinTask = new ForkJoinPool();
        CountTask task = new CountTask(0, 200000L);
        ForkJoinTask<Long> result = forkJoinTask.submit(task);
        try {
            long res = result.get();
            System.out.println("sum:" + res);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}
